/* 
Пример перемещающегося светодиода

CodeVisionAVR C Compiler
(C) 2000-2002 HP InfoTech S.R.L.
www.hpinfotech.ro

Чип: AT90S8515
Модель Памяти: SMALL
Размер Стека Данных: 128 байт

8 светодиодов подключены между выходами
PORTC и +5V через токоограничительные
резисторы 1K
Аноды светодиодов подключены к +5V

На STK500 нужно только соединить
разъемы PORTC и LEDS между собой
с помощью 10-жильного кабеля
*/

// Определения регистров ввода/вывода для AT90S8515
#include <90s8515.h>

// частота кварца [Hz]
#define xtal 3686400
// частота перемещения светодиода [Hz]
#define fmove 2

// Светодиод будет включен при 0 на выходе ПОРТА C
unsigned char led_status=0xfe; 

// Программа обслуживания прерывания по переполнению 
// Таймера/Счетчика 1, которое происходит каждые 0.5 секунд

interrupt [TIM1_OVF] void timer1_overflow(void)
{
// снова инициализируем Таймера/Счетчик 1
TCNT1=0x10000-(xtal/1024/fmove);
// переместим светодиод
led_status<<=1;
led_status|=1;
if (led_status==0xff) led_status=0xfe;
// включим светодиод
PORTC=led_status;
}

void main(void)
{
// установим порты ввода/вывода
// все выводы PORTC - выходы
DDRC=0xff;
// включим первый светодиод
PORTC=led_status;

// инициализируем Таймер/Счетчик 1
// Таймер/Счетчик 1 отсоединим от вывода OC1
// ШИМ нет
TCCR1A=0;
// тактовая частота Таймера/Счетчика 1 - xtal/1024
TCCR1B=5;
// инициализируем Таймер/Счетчик 1
TCNT1=0x10000-(xtal/1024/fmove);
// очистим флаги прерываний Таймера/Счетчика 1
TIFR=0;
// разрешим прерывание по переполнению Таймера/Счетчика 1
TIMSK=0x80;
// запретим все другие источники прерываний
GIMSK=0;

// глобальное разрешение прерываний
#asm
sei
#endasm

// остальное делается посредством прерываний 
// по переполнению Таймера/Счетчика 1
while (1);
}
